package jvm.autoMemoryManagement;

/**
 * staticObj、instanceObj、localObj存放在哪里？
 * 随着之前学的内容， staticObj 随着Test的类型信息存放在方法区中， instanceObj 随着 Test的实例对象存放在java 堆中，
 * localObj 则是存放在 foo()方法栈帧的局部变量表中。
 * -Xmx10m -XX:+UseSerialGC -XX:-UseCompressedOops
 * @author msi
 */
public class JHSDBTestCase {

    static class Test {
        static ObjectHolder staticObj = new ObjectHolder();
        ObjectHolder instanceObj = new ObjectHolder();

        void foo() {
            ObjectHolder localObj = new ObjectHolder();
            System.out.println("done");    // 这里设一个断点
        }
    }

    private static class ObjectHolder {
        public int age;
    }

    public static void main(String[] args) {
        Test test = new JHSDBTestCase.Test();
        test.foo();
    }
}

/**
 * 详细步骤:
 *      1.jps :使用jps获取LVMID
 *      2.jhsdb hsdb --pid LVMID:进入 JHSDB图形化页面。
 *      3.点击菜单中的 Tools -> Heap Parameters : 该操作与 Windows -> Console 中输入 universe等效。获取堆的范围 e.g: 0x000010000 - 0x0000fffff;
 *      4.打开 Windows -> Console 使用 scanoops 命令在3中的范围查找对象  e.g: scanoops  0x0000010000 0x00000fffff JHSDTestCase$ObjectHolder 可以查到三个对象地址
 *      5.使用 Tools -> Inspector 功能确认一下这三个地址中存放的对象。
 *      6.使用 Tools -> Compute Reverse Ptrs 获取堆中实例对象的引用指针，    <==> Console 中输入: revptrs 0x000122121 (实例对象地址)
 *      7.通过Inspector 看出这确实是一个Class实例对象，里面有一个名为staticObj的实例字段。
 *      8.通过7的步骤可以获取到对象实例，instanceObj
 *      9.不过这个命令似乎无法查找栈上的指针引用， 不过可以通过 Java Thread -> main线程 -> Stack Memory 查看该线程的栈内存，可以通过肉眼去比较 localObj 是否在栈帧上 QAQ!
 */
